package pe.edu.unmsm.ocaa.workspace.negocio.servicio.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import pe.edu.unmsm.ocaa.workspace.integracion.dao.UsuarioDAO;
import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.BDUsuarioGrupoDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.GrupoDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.UsuarioDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.VWUsuarioDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.VentanaPrincipalDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.servicio.GrupoService;
import pe.edu.unmsm.ocaa.workspace.negocio.servicio.UsuarioService;

@Service
public class UsuarioServiceImpl implements UsuarioService {
	
	@Resource
	UsuarioDAO usudao;
	@Resource
	GrupoService grupoService;
	
	private static final String DIR_MENU_ROL_ADMIN="/common/menu.xhtml";
	private static final String DIR_MENU_ROL_USU_FACU="/common/menuRolUsuFac.xhtml";
	private static final String DIR_MENU_ROL_USU_FINAL="/common/menuRolUsuFinal.xhtml";

	@Override
	public boolean validarUsuarioyPassword(String nickname, String password)
			throws DataAccessException {
		return usudao.validarNikPsw(nickname, password);
	}

	@Override
	public void guardarUsuario(UsuarioDTO usuario) throws DataAccessException {
		if(usuario.getIdUsuario()==null)
		{
			Integer idUsuario=usudao.insertUsuario(usuario);
			for (String nomGrupo : usuario.getGrupos())
				usudao.insertGrupoUsuario(nomGrupo, idUsuario);	
		}
		else
		{
			usudao.updateUsuario(usuario);
			usudao.deleteGrupoUsuario(usuario.getIdUsuario());
			for (String nomGrupo : usuario.getGrupos())
				usudao.insertGrupoUsuario(nomGrupo, usuario.getIdUsuario());
		}
	}

	@Override
	public List<VWUsuarioDTO> listarUsuariosxIdArchivo(Integer idArchivo) throws DataAccessException {
		return usudao.listUsuariosxArchivo(idArchivo);
	}

	@Override
	public UsuarioDTO obtenerUsuario(Integer idUsuario)
			throws DataAccessException {
		UsuarioDTO usuario=usudao.selectUsuario(idUsuario);
		usuario.setGrupos(grupoService.listarGruposString(idUsuario));
		return usuario;
		
	}

	@Override
	public void activarBloquearUsuario(UsuarioDTO usuario)
			throws DataAccessException {
		if(usuario.getIdEstado()==1)
			usuario.setIdEstado(0);
		else
			usuario.setIdEstado(1);
		usudao.updateUsuario(usuario);
	}

	@Override
	public void eliminarUsuario(Integer idUsuario) throws DataAccessException {
		usudao.deleteUsuario(idUsuario);
	}

	@Override
	public List<UsuarioDTO> listarUsuariosLikeNick(String nickUsuario)
			throws DataAccessException {
		return usudao.listNicksUsuarioxNick(nickUsuario);
	}

	@Override
	public List<VWUsuarioDTO> listarUsuarios() throws DataAccessException {
		List<VWUsuarioDTO> listUsuarios=new ArrayList<VWUsuarioDTO>();
		List<BDUsuarioGrupoDTO> listBDUusuarios=usudao.listUsuarios();
		Integer idUsu=0;
		for (BDUsuarioGrupoDTO bdUsuarioGrupoDTO : listBDUusuarios) {
			if(!bdUsuarioGrupoDTO.getIdUsuario().equals(idUsu))
			{
				VWUsuarioDTO nuevoUsu= new VWUsuarioDTO();
				nuevoUsu.setApeMatUsuario(bdUsuarioGrupoDTO.getApeMatUsuario());
				nuevoUsu.setApePatUsuario(bdUsuarioGrupoDTO.getApePatUsuario());
				nuevoUsu.setCargoUsuario(bdUsuarioGrupoDTO.getCargoUsuario());
				nuevoUsu.setEmailUsuario(bdUsuarioGrupoDTO.getEmailUsuario());
				nuevoUsu.setEstadoUsuario(bdUsuarioGrupoDTO.getEstadoUsuario());
				nuevoUsu.setIdUsuario(bdUsuarioGrupoDTO.getIdUsuario());
				nuevoUsu.setNickUsuario(bdUsuarioGrupoDTO.getNickUsuario());
				nuevoUsu.setNomUsuario(bdUsuarioGrupoDTO.getNomUsuario());
				nuevoUsu.setPerfilUsuario(bdUsuarioGrupoDTO.getPerfilUsuario());
				nuevoUsu.setPermisoxArchivo(bdUsuarioGrupoDTO.getPermisoxArchivo());
				nuevoUsu.setPswUsuario(bdUsuarioGrupoDTO.getPswUsuario());
				nuevoUsu.setTelfUsuario(bdUsuarioGrupoDTO.getTelfUsuario());
				nuevoUsu.setGrupos(new ArrayList());
				
				GrupoDTO grupo=new GrupoDTO();
				grupo.setIdGrupo(bdUsuarioGrupoDTO.getIdGrupo());
				grupo.setNomGrupo(bdUsuarioGrupoDTO.getDescGrupo());
				nuevoUsu.getGrupos().add(grupo);
				listUsuarios.add(nuevoUsu);
				idUsu=bdUsuarioGrupoDTO.getIdUsuario();
			}else
			{
				GrupoDTO grupo=new GrupoDTO();
				grupo.setIdGrupo(bdUsuarioGrupoDTO.getIdGrupo());
				grupo.setNomGrupo(bdUsuarioGrupoDTO.getDescGrupo());
				listUsuarios.get(listUsuarios.size()-1).getGrupos().add(grupo);
			}
		}
		return listUsuarios;
	}

	@Override
	public UsuarioDTO obtenerUsuarioxNik(String nickUsuario)
			throws DataAccessException {
		return usudao.selectUsuarioxNik(nickUsuario);
	}

	@Override
	public String obtenerDireccionMenu(Integer perfilUsuario)
			throws DataAccessException {
		switch (perfilUsuario) {
		case 1:
			return DIR_MENU_ROL_ADMIN;	
		case 2:
			return DIR_MENU_ROL_USU_FACU;
		case 3:
			return DIR_MENU_ROL_USU_FINAL;
		default:
			return "";
		}
		
	}

	@Override
	public VentanaPrincipalDTO obtenerVentanaPrincipalActual()
			throws DataAccessException {
		return usudao.selectVentanaPrincipalActual();
	}

	@Override

public void guardarVentanaPrincipal(VentanaPrincipalDTO ventanaPrincipal)
			throws DataAccessException {
		usudao.updateVentanaPrincipal(ventanaPrincipal);
	}

	@Override
	public boolean obtenerPermisoVentanaPrincipal(Integer perfilUsuario) throws DataAccessException {
		return perfilUsuario.equals(1)?true:false;
	}

	@Override
	public boolean validarCamposUsuario(UsuarioDTO usuario) {
		boolean band=true;
		if(usuario.getApeMatUsuario().equals(""))
			band=false;
		if(usuario.getApePatUsuario().equals(""))
			band=false;
		if(usuario.getNomUsuario().equals(""))
			band=false;
		if(usuario.getNickUsuario().equals(""))
			band=false;
		if(usuario.getPswUsuario().equals(""))
			band=false;
		if(usuario.getPerfilUsuario().equals(0))
			band=false;
		if(usuario.getGrupos().size()==0)
			band=false;

		return band;
	}

}
